package edu.nf.llmtest.service.Handler;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.nf.llmtest.common.annotation.MessageType;
import edu.nf.llmtest.mapper.ConversationMapper;
import edu.nf.llmtest.mapper.SessionMapper;
import edu.nf.llmtest.model.dto.MessageEnvelope;
import edu.nf.llmtest.model.entity.Conversations;
import edu.nf.llmtest.model.entity.Session;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.stereotype.Service;

import java.nio.charset.StandardCharsets;

/**
 * @ Author bin
 * @ Create  2025/10/30 下午4:22
 * 添加会话操作
 **/
@MessageType("addConversationHanlder")
@Service
@Slf4j
@RequiredArgsConstructor
public class AddConversationsHanlder implements MessageHandler{
    private final ObjectMapper objectMapper = new ObjectMapper();
    private final ConversationMapper conversationMapper;
    
    /**
     * 移除字符串中的4字节UTF-8字符（包括emoji）
     * 这些字符在utf8字符集中无法存储，会导致数据库错误
     */
    private String removeEmoji(String text) {
        if (text == null || text.isEmpty()) {
            return text;
        }
        // 移除所有4字节UTF-8字符（包括emoji）
        // 4字节UTF-8字符的范围：U+10000 到 U+10FFFF
        // 在Java中，这些字符用两个char（代理对）表示：高代理（High Surrogate）和低代理（Low Surrogate）
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            // 检查是否是高代理（代理对的第一个字符）
            if (Character.isHighSurrogate(c)) {
                // 跳过这个字符和下一个字符（完整的代理对）
                i++; // 跳过低代理
                continue;
            }
            // 检查是否是低代理（不应该单独出现，但如果出现也跳过）
            if (Character.isLowSurrogate(c)) {
                continue;
            }
            // 保留普通字符（1-3字节UTF-8字符）
            sb.append(c);
        }
        return sb.toString();
    }

    @Override
    public void handle(Message message) {
        String body = new String(message.getBody(), StandardCharsets.UTF_8);

        try {
            MessageEnvelope<Conversations> wrapper = objectMapper.readValue(
                    body,
                    new TypeReference<MessageEnvelope<Conversations>>() {}
            );
            Conversations conversations = wrapper.getData();
            
            // 移除消息中的emoji字符，避免数据库编码问题
            String originalMessage = conversations.getMessage();
            if (originalMessage != null) {
                String cleanedMessage = removeEmoji(originalMessage);
                if (!originalMessage.equals(cleanedMessage)) {
                    log.debug("移除了消息中的emoji字符: {} -> {}", 
                            originalMessage.substring(0, Math.min(50, originalMessage.length())),
                            cleanedMessage.substring(0, Math.min(50, cleanedMessage.length())));
                }
                conversations.setMessage(cleanedMessage);
            }
            
            conversationMapper.addConversation(conversations);
        } catch (Exception e) {
            log.error("解析用户消息失败: {}", body, e);
        }
    }
}
